今天先來講執行程式的基本,變數要怎麼宣告與使用。
在 Shell 或是 ShellScript 如果要宣告一個變數,只要用 =
號就可以宣告,左邊是變數名稱,右邊是變數內容,等號前後不可以有空白、等號前後不可以有空白、等號前後不可以有空白。
這是一個宣告變數的範例:
CFG="--set-upstream -q --all"
這個範例中,我們宣告了一個叫做 CFG
的變數,內容是 --set-upstream -q --all
,至於為什麼會有雙引號……請複習上一篇!至於等號後面有空白不跳脫的功能,則是「執行後面的指令帶入這個變數」,像是你可以下 LANG=C apt-get
這樣只有這次執行 apt-get
的時候,會轉成英文,剩下的指令還是顯示中文。
JavaScript 可以用 console.log("HELLO WORLD");
來 Hello World
、 Pyhton 可以用 print("HELLO WORLD")
。在 Shell 裡面可以用 echo HELLO WORLD
把字串印出來。如果是變數呢?在 Shell 裡面則是用 $
號讓 Shell 知道這是個變數,所以我們可以下指令 echo $CFG
把剛剛的東西印出來。
不過用 echo
印內容有個小問題,就是當你的內容是 -n
的時候,因為 echo
這個指令可以帶 -n
參數進去(用意是印完之後不換行),怎麼解決之後再說。
確認資料寫進去變數,就可以來正是用,下面就是個使用案例:
git push $CFG -f
Shell 收到你打的這堆東西,會先去找 $CFG
是什麼東西,替換後變成以下的指令:
git push --set-upstream -q --all -f
再去呼叫 git
,告訴它有五個參數(下略)。
那如果今天是這樣呢:
BASE_URL="http://localhost/api"
然後我要測試我的 API api_getList
,也就是 http://localhost/api_getList
是否正常,我懶得重複打 prefix 總可以吧?
curl $BASE_URL_getList?mode=1
等等,他不會動!是的,整個黏再一起 Shell 並不會去找 BASE_URL
,而是會去找 BASE_URL_getList
。這怎麼辦呢?用跳脫符號 \
嗎?雖然跳脫符號確實有用,不過太難懂的,所以還是講個正經的做法吧:
curl ${BASE_URL}_getList?mode=1
這樣也可以明確讓 Shell 知道你要找 BASE_URL
這個變數,然後跟後面的 _getList?mode=1
要黏黏再一起,中間不要有空白。
不過直接用 NAME=CONTENT
宣告,進去 vim 裡面打 :!echo $NAME
沒東西,這是因為這種宣告方式宣告的東西,不會讓送到底下的環境。如果要讓 vim 或是其他環境可以吃到,前面要加個 export
,變成這樣:export NAME=CONTENT
以上就是 Shell 裡面變數的宣告與使用,今天寫夠多了,還差點寫超過 12 點,明天見。
我是誰?
我是 dd-han ,可以叫我呆翰,是國立臺中科技大學的延畢生 與 創科資訊的時習生。